/*
 * UART_XDS_PC.h - UART XDS PC通信驱动头文件
 * 适用于MSPM0G3507微控制器
 * 专门用于通过XDS与PC进行调试通信
 */

#ifndef UART_XDS_PC_H_
#define UART_XDS_PC_H_

#include "ti_msp_dl_config.h"
#include <stdint.h>
#include <stdbool.h>

// UART_XDS_PC缓冲区大小定义
#define UART_XDS_PC_TX_BUFFER_SIZE     512
#define UART_XDS_PC_RX_BUFFER_SIZE     512
#define UART_XDS_PC_LINE_BUFFER_SIZE   128

// UART_XDS_PC状态定义
typedef enum {
    UART_XDS_PC_STATUS_SUCCESS = 0,
    UART_XDS_PC_STATUS_ERROR,
    UART_XDS_PC_STATUS_BUSY,
    UART_XDS_PC_STATUS_TIMEOUT,
    UART_XDS_PC_STATUS_BUFFER_FULL,
    UART_XDS_PC_STATUS_BUFFER_EMPTY,
    UART_XDS_PC_STATUS_LINE_READY
} UART_XDS_PC_Status_t;

// UART_XDS_PC配置结构体
typedef struct {
    uint32_t baudRate;          // 波特率（默认115200）
    bool enableTxInterrupt;     // 发送中断使能
    bool enableRxInterrupt;     // 接收中断使能
    bool enableLineMode;        // 行模式使能（以换行符为分隔）
    char lineTerminator;        // 行结束符（默认'\n'）
} UART_XDS_PC_Config_t;

// UART_XDS_PC缓冲区结构体
typedef struct {
    uint8_t buffer[UART_XDS_PC_TX_BUFFER_SIZE];
    volatile uint16_t head;
    volatile uint16_t tail;
    volatile uint16_t count;
} UART_XDS_PC_TxBuffer_t;

typedef struct {
    uint8_t buffer[UART_XDS_PC_RX_BUFFER_SIZE];
    volatile uint16_t head;
    volatile uint16_t tail;
    volatile uint16_t count;
} UART_XDS_PC_RxBuffer_t;

// 行缓冲区结构体（用于处理完整的命令行）
typedef struct {
    char buffer[UART_XDS_PC_LINE_BUFFER_SIZE];
    volatile uint16_t length;
    volatile bool ready;
    char terminator;
} UART_XDS_PC_LineBuffer_t;

// UART_XDS_PC句柄结构体
typedef struct {
    UART_Regs *instance;                    // UART实例
    UART_XDS_PC_TxBuffer_t txBuffer;        // 发送缓冲区
    UART_XDS_PC_RxBuffer_t rxBuffer;        // 接收缓冲区
    UART_XDS_PC_LineBuffer_t lineBuffer;    // 行缓冲区
    volatile bool txBusy;                   // 发送忙标志
    volatile bool rxBusy;                   // 接收忙标志
    volatile bool lineMode;                 // 行模式标志
    volatile uint32_t lastActivity;         // 最后活动时间
} UART_XDS_PC_Handle_t;

// 函数声明
/**
 * @brief 初始化UART_XDS_PC驱动
 * @param handle UART_XDS_PC句柄指针
 * @param config UART_XDS_PC配置指针
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_Init(UART_XDS_PC_Handle_t *handle, const UART_XDS_PC_Config_t *config);

/**
 * @brief 反初始化UART_XDS_PC驱动
 * @param handle UART_XDS_PC句柄指针
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_DeInit(UART_XDS_PC_Handle_t *handle);

/**
 * @brief 发送单个字节
 * @param handle UART_XDS_PC句柄指针
 * @param data 要发送的数据
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_SendByte(UART_XDS_PC_Handle_t *handle, uint8_t data);

/**
 * @brief 发送数据缓冲区
 * @param handle UART_XDS_PC句柄指针
 * @param data 数据缓冲区指针
 * @param length 数据长度
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_SendData(UART_XDS_PC_Handle_t *handle, const uint8_t *data, uint16_t length);

/**
 * @brief 发送字符串
 * @param handle UART_XDS_PC句柄指针
 * @param str 字符串指针
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_SendString(UART_XDS_PC_Handle_t *handle, const char *str);

/**
 * @brief 发送字符串并添加换行符
 * @param handle UART_XDS_PC句柄指针
 * @param str 字符串指针
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_SendLine(UART_XDS_PC_Handle_t *handle, const char *str);

/**
 * @brief 格式化输出（类似printf）
 * @param handle UART_XDS_PC句柄指针
 * @param format 格式字符串
 * @param ... 可变参数
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_Printf(UART_XDS_PC_Handle_t *handle, const char *format, ...);

/**
 * @brief 接收单个字节
 * @param handle UART_XDS_PC句柄指针
 * @param data 接收数据的指针
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_ReceiveByte(UART_XDS_PC_Handle_t *handle, uint8_t *data);

/**
 * @brief 接收数据到缓冲区
 * @param handle UART_XDS_PC句柄指针
 * @param data 数据缓冲区指针
 * @param length 期望接收的长度
 * @param receivedLength 实际接收的长度指针
 * @param timeout 超时时间（毫秒）
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_ReceiveData(UART_XDS_PC_Handle_t *handle, uint8_t *data, uint16_t length, uint16_t *receivedLength, uint32_t timeout);

/**
 * @brief 接收一行数据（以换行符结束）
 * @param handle UART_XDS_PC句柄指针
 * @param line 行缓冲区指针
 * @param maxLength 缓冲区最大长度
 * @param timeout 超时时间（毫秒）
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_ReceiveLine(UART_XDS_PC_Handle_t *handle, char *line, uint16_t maxLength, uint32_t timeout);

/**
 * @brief 检查是否有完整的行数据可读
 * @param handle UART_XDS_PC句柄指针
 * @return bool true表示有完整行数据
 */
bool UART_XDS_PC_IsLineReady(UART_XDS_PC_Handle_t *handle);

/**
 * @brief 获取接收缓冲区中的数据数量
 * @param handle UART_XDS_PC句柄指针
 * @return uint16_t 数据数量
 */
uint16_t UART_XDS_PC_GetRxDataCount(UART_XDS_PC_Handle_t *handle);

/**
 * @brief 获取发送缓冲区中的空闲空间
 * @param handle UART_XDS_PC句柄指针
 * @return uint16_t 空闲空间大小
 */
uint16_t UART_XDS_PC_GetTxFreeSpace(UART_XDS_PC_Handle_t *handle);

/**
 * @brief 清空接收缓冲区
 * @param handle UART_XDS_PC句柄指针
 */
void UART_XDS_PC_FlushRxBuffer(UART_XDS_PC_Handle_t *handle);

/**
 * @brief 清空发送缓冲区
 * @param handle UART_XDS_PC句柄指针
 */
void UART_XDS_PC_FlushTxBuffer(UART_XDS_PC_Handle_t *handle);

/**
 * @brief 清空行缓冲区
 * @param handle UART_XDS_PC句柄指针
 */
void UART_XDS_PC_FlushLineBuffer(UART_XDS_PC_Handle_t *handle);

/**
 * @brief UART_XDS_PC中断处理函数
 * @param handle UART_XDS_PC句柄指针
 */
void UART_XDS_PC_IRQHandler(UART_XDS_PC_Handle_t *handle);

/**
 * @brief 设置行模式
 * @param handle UART_XDS_PC句柄指针
 * @param enable 是否启用行模式
 */
void UART_XDS_PC_SetLineMode(UART_XDS_PC_Handle_t *handle, bool enable);

/**
 * @brief 获取最后活动时间
 * @param handle UART_XDS_PC句柄指针
 * @return uint32_t 最后活动时间
 */
uint32_t UART_XDS_PC_GetLastActivity(UART_XDS_PC_Handle_t *handle);

// 便利函数声明（使用默认句柄）
/**
 * @brief 初始化默认UART_XDS_PC（使用系统配置的UART_XDS_PC）
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_InitDefault(void);

/**
 * @brief 使用默认UART_XDS_PC发送字符串
 * @param str 字符串指针
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_DefaultSendString(const char *str);

/**
 * @brief 使用默认UART_XDS_PC发送一行
 * @param str 字符串指针
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_DefaultSendLine(const char *str);

/**
 * @brief 使用默认UART_XDS_PC格式化输出
 * @param format 格式字符串
 * @param ... 可变参数
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_DefaultPrintf(const char *format, ...);

/**
 * @brief 使用默认UART_XDS_PC接收一行
 * @param line 行缓冲区指针
 * @param maxLength 缓冲区最大长度
 * @param timeout 超时时间（毫秒）
 * @return UART_XDS_PC_Status_t 状态码
 */
UART_XDS_PC_Status_t UART_XDS_PC_DefaultReceiveLine(char *line, uint16_t maxLength, uint32_t timeout);

// 全局默认UART_XDS_PC句柄
extern UART_XDS_PC_Handle_t g_defaultXDS_PC;

#endif /* UART_XDS_PC_H_ */
